﻿/*
SINACOR - BMF&Bovespa
Arquivo: ExportacaoNegocio.cs
Criado em: 16-jun-2010 16:39:07
Arquiteto Responsável: p-wgeneroso
*/
using System;
using System.Collections.Generic;
using System.Text;
using System.Linq;
using Sinacor.Infra.Common;
using Sinacor.Infra.UI.Common;
using Sinacor.Infra.Common.Exceptions;
using Sinacor.Infra.UI.FileTransfer.Client;
using System.IO;
using Sinacor.Infra.UI.Authorization;


namespace Sinacor.UI.Bovespa.ImportacaoExportacao.Presenter 
{
    public class ExportacaoNegocio : ImportacaoExportacaoBase<IImportacaoExportacaoBase, Model.Parameter.FiltroExportacaoNegocio>, IDisposable, IImportacaoExportacaoPresenter
	{
		#region Atributos
		private Communication.ProcessoExportacao _communicationProcessoExportacao;
        private Communication.Calendario _communicationCalendario;
		#endregion

        #region Construtores

        public ExportacaoNegocio(IExportacaoNegocio view)
            : this(view, null)
        {
        }

        public ExportacaoNegocio(IExportacaoNegocio view, Model.Parameter.IFiltroImportacaoExportacao filtro)
            : base(view, filtro)
        {
            this._communicationProcessoExportacao = new Communication.ProcessoExportacao(this.Session);
            this._communicationProcessoExportacao.CommunicationError += new EventHandler<CommunicationErrorEventArgs>(_communicationProcessoExportacao_CommunicationError);
            this._communicationProcessoExportacao.ExportacaoConcluida +=new Action(_communicationProcessoExportacao_ExportacaoConcluida);
            this._communicationProcessoExportacao.Aborted += new EventHandler(_communicationProcessoExportacao_Aborted);
            this._communicationProcessoExportacao.ProcessStatusReceived += new EventHandler<PSE.ProcessManager.Client.Process.ProcessStatusEventArgs>(_communicationProcessoExportacao_ProcessStatusReceived);
            this._communicationCalendario = new Sinacor.UI.Bovespa.ImportacaoExportacao.Communication.Calendario(this.Session);
        }

        #endregion

        #region Propriedades Override

        protected override bool PermissaoProcessamentoArquivo
        {
            get
            {
                bool temPermissao = true;
                string modulo = string.Empty;
                string funcao = string.Empty;

                if (Filtro.TipoArquivo == Sinacor.UI.Bovespa.ImportacaoExportacao.Model.Enum.TipoArquivo.NEGS)
                {
                    if (Filtro.TipoSistema == Model.Enum.TipoSistema.Bolsa)
                    {
                        funcao = "BNEGS";
                        modulo = "BOL";
                    }
                    else
                    {
                        funcao = "NEGS";
                        modulo = "ORD";
                    }

                    temPermissao = AuthorizationManager.GetInstance().CheckUserAccess(modulo, funcao);
                }

                return temPermissao;
            }
        }

        #endregion

        #region Event Handle

        private void _communicationProcessoExportacao_ProcessStatusReceived(object sender, PSE.ProcessManager.Client.Process.ProcessStatusEventArgs e)
        {
            StatusProcesso.Step = e.Status.Step;
            StatusProcesso.Progress = e.Status.Progress;

            View.AtualizarStatus();
        }

        private void _communicationProcessoExportacao_Aborted(object sender, EventArgs e)
        {
            try
            {
                StatusProcesso.Step = "Bovespa.ImportacaoExportacao.Message.ExportacaoCancelada";
                StatusProcesso.Progress = 0;
                StatusProcesso.FinalizedAt = default(DateTime);

                View.DesabilitarCancelamentoProcesso();
                View.AtualizarStatus();
                View.InformarExportacaoCancelada();
            }
            catch (Exception ex)
            {
                HandleException(ex);
            }
        }

        private void _communicationProcessoExportacao_CommunicationError(object sender, CommunicationErrorEventArgs e)
        {
            try
            {
                StatusProcesso.Step = "Bovespa.ImportacaoExportacao.Message.ExportacaoInterrompida";
                StatusProcesso.Progress = 0;
                StatusProcesso.FinalizedAt = default(DateTime);

                View.DesabilitarCancelamentoProcesso();
                View.AtualizarStatus();
                View.InformarErroExportacao();

                HandleException(e.Exception);
            }
            catch (Exception ex)
            {
                HandleException(ex);
            }
        }

        private void _communicationProcessoExportacao_ExportacaoConcluida()
        {
            try
            {
                StatusProcesso.Step = "Bovespa.ImportacaoExportacao.Message.ExportacaoConcluida";
                StatusProcesso.Progress = 100;
                StatusProcesso.FinalizedAt = DateTime.Now;

                this.EfetuarDownloadArquivo();

                View.DesabilitarCancelamentoProcesso();
                View.AtualizarStatus();
                View.InformarExportacaoConcluida();
            }
            catch (Exception ex)
            {
                HandleException(ex);
            }
        }

        #endregion

        #region Metodos Override

        public override void Dispose()
        {
             _communicationProcessoExportacao.Disconnect();

            base.Dispose();
        }

        protected override void InicializarTela()
        {
            this.CarregarCalendario();
        }

        protected override void CancelarProcesso()
        {
            try
            {
                _communicationProcessoExportacao.Abort();
            }
            catch (Exception ex)
            {
                HandleException(ex);
            }
        }

        public override void Executar()
        {
            try
            {
                switch (base.Filtro.TipoArquivo)
                {
                    case Model.Enum.TipoArquivo.NEGS:
                        base.Filtro.TipoFormatoArquivo = Model.Enum.TipoFormatoArquivo.TXT;
                        break;
                    case Model.Enum.TipoArquivo.NEGSXML:
                        base.Filtro.TipoFormatoArquivo = Model.Enum.TipoFormatoArquivo.XML;
                        break;
                    default:
                        base.Filtro.TipoFormatoArquivo = Model.Enum.TipoFormatoArquivo.TXT;
                        break;
                }

                if (View.ConfirmarExportacao() && !_communicationProcessoExportacao.IsProcessRunning())
                {
                    View.HabilitarCancelamentoProcesso();
                    this.AtualizarStatusInicioExportacao();
                    _communicationProcessoExportacao.ExportarNegocios(base.Filtro);
                }
            }
            catch (Exception ex)
            {
                this.HandleException(ex);
            }
        }

        #endregion

        #region Métodos

        private void AtualizarStatusInicioExportacao()
        {
            StatusProcesso.Step = "Bovespa.ImportacaoExportacao.Message.PreparandoExportacao";
            StatusProcesso.Progress = 0;
            StatusProcesso.StartedAt = DateTime.Now;
            StatusProcesso.FinalizedAt = new DateTime();

            View.AtualizarStatus();
        }

        private void EfetuarDownloadArquivo()
		{
            FileInfo fi = new FileInfo(Filtro.NomeArquivo);
            
            FileRepository.GetInstance().DownloadFile("Bovespa.Negocio", fi.Name, Filtro.NomeArquivo);
		}

        private void CarregarCalendario()
        {
            ModelCollection<Model.Calendario> colecaoCalendario = null;
            
            try
            {
                colecaoCalendario = this._communicationCalendario.ConsultarCalendario();

                if (colecaoCalendario != null)
                {

                    var resultado =
                            from col in colecaoCalendario
                            orderby col.DataPregao descending
                            select col;

                    this.Calendario = new ModelCollection<Model.Calendario>(resultado);
                }

                View.AtualizarListaCalendario();
            }
            catch (Exception ex)
            {
                this.HandleException(ex);
            }
        }

		#endregion

        #region IImportacaoExportacaoPresenter Members

        public new Model.Parameter.IFiltroImportacaoExportacao Filtro
        {
            get
            {
                return base.Filtro;
            }
            set
            {
                base.Filtro = (Model.Parameter.FiltroExportacaoNegocio)value;
            }
        }

        public bool IsRunning
        {
            get
            {
                if (this._communicationProcessoExportacao != null)
                    return this._communicationProcessoExportacao.IsProcessRunning();
                else
                    return false;
            }
        }

        #endregion
    }

}
